语法

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null
1
2
{syn:[1,2,3]} 表示syn的值是一个数组,里面有三个元素 1 2 3
或者 {syn:[{'value':1},{'value':2},{'value':3}]}; syn的值是一个数组 ,数组里每个对元素是一个对象。

JSON 对象

1
2
3
4
5
{
"ID":1001,
"name":"nnn",
"age":23
}

JSON 对象数组

1
2
3
4
5
[
{"ID":1001,"name":"zhangsan","age":24},
{"ID":1002,"name":"lisi","age":252222},
{"ID":1003,"name":"wangwu","age":2224}
]

JSON 字符串

  • 它必须是一个字符串,由""或者''包裹数据,支持字符串的各种操作。
  • 里面的数据格式应该要满足其中一个格式,可以是JSON对象,也可以是JSON对象数组或者是基本形式的组合变形。

fastJSON

fastJSON可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。

使用

在fastJSON中,可以发现三个主要的类,JSON,JSONObject,JSONArray。

三者的关系是JSONObject 和JSONArray 继承JSON。

JSONObject是JSON字符串与pojo对象转换过程中的中间表达类型,实现了Map接口,可以看做是一个模拟JSON对象键值对再加上多层嵌套的数据集合,对象的每一个基本类型属性是map里的一个key-value,一个非基本类型属性是一个嵌套的JSONObject对象(key是属性名称,value是表示这个属性值的对象的JSONObject)。

可以发现,JSONObject代表json对象,JSONArray代表json对象数组,JSON代表JSONObject和JSONArray的转化。


JSONObject 对象JSON对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取”键:值”对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。


JSONArray代表json对象数组,json数组对象中存储的是一个个json对象,所以类中的方法主要用于直接操作json对象。比如这其中的add(),remove(),containsAll()方法,对应于json对象的添加,删除与判断。和JSONObject 一样,其中也有一些get()方法,不过都不常用,最常用的是getJSONObject(int index)方法,该方法用于获取json对象数组中指定位置的JSONObject对象,配合size()方法,可用于遍历json对象数组中的各个对象。


JSON类主要是实现转化用的,最后的数据获取,还是要通过上面的JSONObject和JSONArray来实现。

  • JSON.toJSONString()方法,实现JSON对象转换为json字符串和Javabean 转换为json字符串。
  • JSON.parseObject()方法,实现json字符串转换为json对象或javabean对象,该方法返回JSONObject对象,用于实现json字符串向json对象的转化。json字符串与javaBean之间的转换可以使用 Class这个类。
  • JSON.parseArray()将json字符串转化为json对象数组或转化成包含泛型的List
  • JSON.toJSON()方法,实现JavaBean对象转换为json对象。
  • JSON.toJavaObject()方法,实现json对象转化为javabean对象

对于jsonstring转POJO(或POJO转jsonstring),尽量使用直接转的方式,而不是先转成JSONObject过渡的方式。特别是对于Fastjson,由于性能优化的考虑,这两个执行的代码是不一样的,可能导致不一样的结果。

1
2
3
4
5
6
7
8
9
String jsonstring = "{\"a\":12}";

// 不推荐这种方式
// 除非这里需要对jsonObject做一些简单处理
JSONObject jsonObject = JSON.parseObject(jsonstring);
A a = jsonObject.toJavaObject(A.class);

// 推荐方式
A a = JSON.parseObject(jsonstring, A.class);

最佳实践

序列化一个Java对象成JSON字符串
1
2
3
4
5
6
7
User user = new User();
user.setName("校长");
user.setAge(3);
user.setSalary(new BigDecimal("123456789.0123"));
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
// 输出 {"age":3,"name":"校长","old":false,"salary":123456789.0123}
反序列化一个JSON字符串成Java对象
1
2
3
4
5
6
7
8
9
 String jsonString = "{\"age\":3,\"birthdate\":1496738822842,\"name\":\"校长\",\"old\":true,\"salary\":123456789.0123}";
User u = JSON.parseObject(jsonString ,User.class);
System.out.println(u.getName());
// 输出 校长

String jsonStringArray = "[{\"age\":3,\"birthdate\":1496738822842,\"name\":\"校长\",\"old\":true,\"salary\":123456789.0123}]";
List<User> userList = JSON.parseArray(jsonStringArray, User.class);
System.out.println(userList.size());
// 输出 1